In Bangladesh, bats, humans, and livestock live in close proximity, with likely overlap in consumption of common food resources (e.g., date palm sap and various fruits). Pteropus bats in Bangladesh are reservoir hosts for Nipah virus, which is transmitted from bats to people through shared consumption of date palm sap and then can be transmitted from person-to-person. Given that Nipah virus is a pathogen with pandemic potential, increased understanding of potential transmission routes is highly valuable to design prevention strategies, such as reducing opportunities for human consumption of bat contaminated fruits and date palm sap.
Begin by examining the villages included in the study. All villages have community survey information, but only villages with active date palm sap collection had camera traps at date palm trees and only villages with bats feeding at fruit trees near human fruit consumption areas had camera traps at fruit trees.
Overall, 206 villages were included in the study: 60 case, 72 near control, and 74 far control villages were included. All had community surveys completed.
# Total villages included in study, by village type
vil.total_long %>%
group_by(case_control_group) %>%
summarize(num_vil = n_distinct(Village_ID)) %>%
mutate(total_vil = sum(num_vil))
# number of villages with each type of data collection
v1 <- vil.total_long %>%
group_by(col_type) %>%
summarize(vil_observed = sum(col_yn)) %>%
mutate(vil_not_observed = 206 - vil_observed,
total_vil = 206,
"perc_vil" = vil_observed/206*100)
## # A tibble: 3 × 5
## col_type vil_observed vil_not_observed total_vil perc_vil
## <fct> <dbl> <dbl> <dbl> <dbl>
## 1 dp.yn 85 121 206 41.3
## 2 f.yn 118 88 206 57.3
## 3 cs.yn 206 0 206 100
# number of villages with each type of data collection, by village type
v2 <- vil.total_long %>%
group_by(case_control_group, col_type) %>%
summarise(vil_observed=sum(col_yn),
total_vil = n()) %>%
mutate(vil_not_observed = total_vil - vil_observed,
"perc_vil" = vil_observed/total_vil*100)
## # A tibble: 9 × 6
## # Groups: case_control_group [3]
## case_control_group col_type vil_observed vil_not_observed total_vil perc_vil
## <chr> <fct> <dbl> <dbl> <int> <dbl>
## 1 case dp.yn 27 33 60 45
## 2 case f.yn 45 15 60 75
## 3 case cs.yn 60 0 60 100
## 4 control, far dp.yn 32 42 74 43.2
## 5 control, far f.yn 30 44 74 40.5
## 6 control, far cs.yn 74 0 74 100
## 7 control, near dp.yn 26 46 72 36.1
## 8 control, near f.yn 43 29 72 59.7
## 9 control, near cs.yn 72 0 72 100
# villages with each tree type observed
vil.total %>%
group_by(Trees_observed) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3))
# villages with each tree type observed, by village type
vil.total %>%
group_by(case_control_group, Trees_observed) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3))
# villages with both fruit and bat visits, not both visits, or not both observations
all_vil %>%
group_by(Trees_observed, yn_visits) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3))
Deciding between the two following graphs for easier information display:
# cumulative and average visit duration to fruit trees by village type
all_data %>%
filter(Number_of_visits > 0, Trees_observed == "Both") %>%
group_by(case_control_group, dp_or_fruit) %>%
summarize(num_visits = n(),
cum = sum(DurContT),
q1 = quantile(DurContT, 0.25),
median = median(DurContT),
mean = mean(DurContT),
q3 = quantile(DurContT, 0.75),
max = max(DurContT))
For villages with both trees observed:
# cumulative and average visit duration to trees by village type and bat type for villages with visits to both tree types
all_data %>%
filter(Number_of_visits > 0, Trees_observed == "Both") %>%
group_by(case_control_group, dp_or_fruit, recode_P_NP) %>%
summarize(num_visits = n(),
cum = sum(DurContT),
q1 = quantile(DurContT, 0.25),
median = median(DurContT),
mean = mean(DurContT),
q3 = quantile(DurContT, 0.75),
max = max(DurContT))
Few visits to fruit trees, so focusing on date palm trees:
As stated above, 85 (out of 206) villages had active date palm sap collection and date palm trees were subsequently observed for bat visits.
# examine number of villages and number of trees observed
date_palm_vil %>%
group_by(case_control_group) %>%
summarize(num_vil = n_distinct(Village_ID),
num_tree = n_distinct(Tree_number)) %>%
mutate("perc_vil" = num_vil/sum(num_vil)*100,
"perc_tree" = num_tree/sum(num_tree)*100)
# average number of trees observed per village
date_palm_vil %>%
group_by(Village_ID) %>%
summarize(num_tree = n_distinct(Tree_number)) %>%
select(num_tree) %>%
summary(n)
## num_tree
## Min. :1.000
## 1st Qu.:2.000
## Median :2.000
## Mean :1.906
## 3rd Qu.:2.000
## Max. :4.000
# average number of trees observed per village, by village type
date_palm_vil %>%
group_by(case_control_group, Village_ID) %>%
summarize(num_tree = n_distinct(Tree_number)) %>%
mutate(min = min(num_tree),
q1 = quantile(num_tree, 0.25),
median = median(num_tree),
mean = mean(num_tree),
q3 = quantile(num_tree, 0.75),
max = max(num_tree)) %>%
select(-c(num_tree, Village_ID)) %>%
distinct()
# villages with bat visits
bat_vil_tot %>%
group_by(yn_visit) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3))
# villages with bat visits, by village type
bat_vil_tot %>%
group_by(case_control_group, yn_visit) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3))
# trees with bat visits
bat_tree_tot %>%
group_by(yn_visit) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3))
# trees with no bat visits by village type
bat_tree_tot %>%
group_by(case_control_group, yn_visit) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3),
cumpercent = round(cumsum(freq = n / sum(n)),3))
# cumulative and average visit duration by village type
date_palm_vil %>%
filter(Number_of_visits > 0) %>%
group_by(case_control_group, recode_P_NP) %>%
summarize(num = n(),
cum = sum(DurContT),
q1 = quantile(DurContT, 0.25),
median = median(DurContT),
mean = mean(DurContT),
q3 = quantile(DurContT, 0.75),
max = max(DurContT))
Stay and contamination percentages by village type
# trees with no bat visits by village type
date_palm_vil %>%
filter(Number_of_visits != 0) %>%
group_by(case_control_group, recode_P_NP) %>%
summarise(pct_stays = mean(Number_of_stays),
n_stay = sum(Number_of_stays),
n_not_stay = sum(Number_of_stays == 0),
pct_cont = mean(Number_of_contaminations),
n_cont = sum(Number_of_contaminations),
n_not_cont = sum(Number_of_contaminations == 0),
pct_stay_cont = mean(ifelse(Number_of_stays == 1,
Number_of_contaminations, NA), na.rm = T),
n_stay_cont = sum(ifelse(Number_of_stays == 1,
Number_of_contaminations, NA), na.rm = T),
n_stay_not_cont = sum(ifelse(Number_of_stays == 1,
Number_of_contaminations == 0, NA), na.rm = T))
As stated above, 118 (out of 206) villages had fruit trees identified that were visited by bats located near the village and where animals/people consume dropped fruit, with fruit trees subsequently observed for bat visits.
# examine number of villages and number of trees observed
fruit_data_vil %>%
group_by(case_control_group) %>%
summarize(num_vil = n_distinct(Village_ID),
num_tree = n_distinct(Tree_number)) %>%
mutate("perc_vil" = num_vil/sum(num_vil)*100,
"perc_tree" = num_tree/sum(num_tree)*100)
# number of fruit trees observed by species
tree_summary_vil <- fruit_data_vil %>%
group_by(case_control_group, Tree_type) %>%
summarize(num_trees = n_distinct(Tree_number)) %>%
mutate("percent_trees" = num_trees/sum(num_trees)*100) %>%
dplyr::rename(tree_type = Tree_type)
tree_summary_vil_buffet <- fruit_data_vil %>%
left_join(all_data %>% dplyr::select(Tree_number, Trees_observed)) %>%
distinct() %>%
group_by(Trees_observed, case_control_group, Tree_type) %>%
summarize(num_trees = n_distinct(Tree_number)) %>%
mutate("percent_trees" = num_trees/sum(num_trees)*100) %>%
dplyr::rename(tree_type = Tree_type)
## Joining, by = "Tree_number"
tree_summary_vil %>%
group_by(tree_type) %>%
summarise(num_trees2 = sum(num_trees)) %>%
arrange(-num_trees2)
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.
## Warning: Removed 1 rows containing missing values (geom_bar).
# average number of fruit trees observed per village
fruit_data_vil %>%
group_by(Village_ID) %>%
summarize(num_tree = n_distinct(Tree_number)) %>%
select(num_tree) %>%
summary(n)
## num_tree
## Min. :1.000
## 1st Qu.:1.000
## Median :2.000
## Mean :1.729
## 3rd Qu.:2.000
## Max. :3.000
# average number of fruit trees observed per village, by village type
fruit_data_vil %>%
group_by(case_control_group, Village_ID) %>%
summarize(num_tree = n_distinct(Tree_number)) %>%
mutate(min = min(num_tree),
q1 = quantile(num_tree, 0.25),
median = median(num_tree),
mean = mean(num_tree),
q3 = quantile(num_tree, 0.75),
max = max(num_tree)) %>%
select(-c(num_tree, Village_ID)) %>%
distinct()
# villages with no bat visits
bat_vil_tot_f %>%
group_by(yn_visit) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3),
cumpercent = round(cumsum(freq = n / sum(n)),3))
# trees with no bat visits
bat_tree_tot_f %>%
group_by(yn_visit) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3),
cumpercent = round(cumsum(freq = n / sum(n)),3))
# trees with no bat visits by village type
bat_tree_tot_f %>%
group_by(case_control_group, yn_visit) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3),
cumpercent = round(cumsum(freq = n / sum(n)),3))
Trees that received visits by buffet and village type:
# total trees visits and trees that received visits by buffet village type
bat_tree_tot_f %>%
left_join(all_data %>% dplyr::select(Tree_number, Trees_observed)) %>%
distinct() %>%
mutate(yn_visit_rc = case_when(yn_visit == "yes" ~ 1,
TRUE ~ 0)) %>%
group_by(Trees_observed) %>%
summarise(n_tree = n(),
n_tree_visited = sum(yn_visit_rc)) %>%
mutate(total_n_tree = (cumsum(n_tree)),
percent_n_tree_visit = round((n_tree_visited / n_tree), 3))
## Joining, by = "Tree_number"
# total trees visits and trees that received visits by buffet village type and village type
bat_tree_tot_f %>%
left_join(all_data %>% dplyr::select(Tree_number, Trees_observed)) %>%
distinct() %>%
mutate(yn_visit_rc = case_when(yn_visit == "yes" ~ 1,
TRUE ~ 0)) %>%
group_by(Trees_observed, case_control_group) %>%
summarise(n_tree = n(),
n_tree_visited = sum(yn_visit_rc)) %>%
mutate(total_n_tree = (cumsum(n_tree)),
total_n_tree_visit = (cumsum(n_tree_visited)),
percent_n_tree_visit = round((n_tree_visited / n_tree), 3))
## Joining, by = "Tree_number"
f.labs <- c("Both tree types village", "Fruit tree only village")
names(f.labs) <- c("Both", "Fruit tree only")
bat_tree_tot_f %>%
left_join(all_data %>% dplyr::select(Tree_number, Trees_observed)) %>%
distinct() %>%
filter(Tree_type == "Fig" |
Tree_type == "Banana" |
Tree_type == "Jujube" |
Tree_type == "Star fruit" |
Tree_type == "Sapodilla" |
Tree_type == "Guava") %>%
ggplot(aes(x=Tree_type, fill = yn_visit)) +
geom_bar(stat = "count", show.legend = TRUE, width = 0.7) +
facet_grid(case_control_group ~ Trees_observed,
labeller = labeller(Trees_observed = f.labs)) +
labs(y = "Number of trees",
x = "Tree types observed",
title = "Number of trees observed and number of trees receiving at least 1 bat visit \nseparated by village type and the tree types observed in each village") +
theme(axis.title.y = element_text(vjust = 1),
axis.title = element_text(size = 10),
plot.title = element_text(size = 12),
axis.text.x = element_text(angle = 45, hjust = 1))
## Joining, by = "Tree_number"
# # overall cumulative and average visit durations
# fruit_data_vil %>%
# filter(Number_of_visits > 0) %>%
# summarize(num = n(),
# cum = sum(DurContT),
# q1 = quantile(DurContT, 0.25),
# median = median(DurContT),
# mean = mean(DurContT),
# q3 = quantile(DurContT, 0.75),
# max = max(DurContT))
# cumulative and average visit duration to fruit trees by village type
all_data %>%
filter(Number_of_visits > 0,
dp_or_fruit == "Fruit") %>%
group_by(Trees_observed, case_control_group, recode_P_NP) %>%
summarize(num_visits = n(),
cum = sum(DurContT),
q1 = quantile(DurContT, 0.25),
median = median(DurContT),
mean = mean(DurContT),
q3 = quantile(DurContT, 0.75),
max = max(DurContT))
# respondents per village
fruit_survey %>%
group_by(Village_ID) %>%
summarise(participants_per_village = n_distinct(dataid)) %>%
summary(participants_per_village)
## Village_ID participants_per_village
## Min. :1002 Min. :12.00
## 1st Qu.:1066 1st Qu.:25.00
## Median :2038 Median :25.00
## Mean :1985 Mean :24.54
## 3rd Qu.:3010 3rd Qu.:25.00
## Max. :3066 Max. :26.00
# respondents by village type
fruit_survey %>%
group_by(case_control_group) %>%
summarise(participants_per_villagetype = n_distinct(dataid))
There are four main questions that assess fruit consumption by bari members, bats, and animals separated by tree type.
The following questions also provide information on the trees available for bats to consume:
Do any fruit trees grow in or around your bari?
# Respondants reporting any fruit tree presence in bari
fruit_survey %>%
group_by(case_control_group) %>%
summarise(total_bar = n(),
yes_tree = sum(q5_1, na.rm= TRUE)) %>%
mutate(percent = round((yes_tree / total_bar), 3))
How many [insert fruit] trees grow in or around your bari?
Do members of your bari eat any [insert fruit] off the ground?
Do members of your bari eat any [insert fruit]?
Do domestic mammals (cow,sheep,goat,pig,dog,cat) eat [insert fruit] off ground?
Do bats eat any [insert fruit]?
Of the tree types included on the survey, only 6 had visits recorded using camera traps.
## Joining, by = c("case_control_group", "fruit", "measure")
## Joining, by = c("case_control_group", "fruit", "measure")
## Joining, by = c("case_control_group", "fruit", "measure")
## Joining, by = c("case_control_group", "fruit", "measure")
When examining bat fruit consumption more closely, for the 6 tree types that received bat visits, there is some mild difference in village types.
# plot bat fruit consumption with x-axis ranked by the average
rank_b_fruit_grouped_mean %>%
filter(fruit == "banana" | fruit == "date.palm"| fruit == "star.fruit"| fruit == "sofeda" | fruit == "guava" | fruit == "buroi") %>%
ggplot(aes(x = fruit, y = bat_fruit, color = case_control_group)) +
geom_jitter(height = 0, width = 0.2, alpha = 0.8) +
labs(x = "Fruit type",
y = "Proportion of baris with bats\nconsuming fruit",
title = "Proportion of respondants reporting bat consumption\nof fruits by village type") +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
axis.title.y = element_text(vjust = 1)) +
scale_color_manual(
name = "Village type",
values = c(
"case" = "#E69F00",
"control, far" = "#56B4E9",
"control, near" = "#009E73"
)
)